package 数据结构.栈和队列.study;
//循环队列：不占用资源【本质上就是利用数组去实现的】
public class MyCircularQueue {
    public int[]elem;
    public int front;//对头下标
    public int rear;//队尾下标
    public int size;//当前数组的元素数量
    public MyCircularQueue(){
        //初始化长度
        elem=new int[24];
    }
    //入队列:对队尾rear做处理【添加进rear指示的位置】
    public int offer(int val){
        if(size==elem.length){
            //证明已经达到容量了
            //扩容
            throw new RuntimeException("队列已满...");
        }
        //将val添加进数组中
        elem[rear]=val;
        //如果rear达到最长那里，那么就置0【重新会到0
        if(rear==size){
            rear=0;
        }else {
            rear++;
        }
        //将数组中的元素数量+1
        size++;
        return val;
    }
    //出队列，出的是先进来那个，即front指示的那个
    public int poll(){
        if(size==0){
            throw new RuntimeException("队列为空");
        }
        int val=elem[front];
        //出队列
        //这里去判断+1之后会不会超出数组的范围，如果会，则置0
       if(front++>elem.length){
           front=0;
       }else {
           front++;
       }
       size--;
       return val;
    }
    //判断什么时候循环已满呢？在没有size的情况下：只能判断front和rear的距离咯
    //判断元素个数
    public int size(){
        return size;
    }

    //获取队首元素
    public int peek(){
        if(size == 0){
            throw new RuntimeException("队列为空...");
        }
        return elem[front];
    }

    // 判断是否为空
    public boolean isEmpty(){
        return size == 0;
    }

}
